package fr.afcepf.atod18.commande.web;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ComponentSystemEvent;

import fr.afcepf.atod18.client.entity.Client;
import fr.afcepf.atod18.commande.entity.ProduitSelectionne;
import fr.afcepf.atod18.utilitaires.entity.InfoSession;
import fr.afcepf.atod18.utilitaires.service.IServiceFacade;

@ManagedBean
@SessionScoped
public class PanierMB {
    @ManagedProperty(value = "#{serviceFacade}")
    IServiceFacade serviceFacade;
    @ManagedProperty(value = "#{commandeMB}")
    CommandeMB commandeMB;

    private InfoSession infoSession;
    private String message;
    private List<ProduitSelectionne> listeProduits;

    private String login;

    @PostConstruct
    public void recupInfoSession (){
		FacesContext fc = FacesContext.getCurrentInstance();
		if(fc !=null && fc.getExternalContext()!=null){
			infoSession=(InfoSession)fc.getExternalContext().getApplicationMap().get("infoSession");
		}
    	
    }
    public void chargeListeProduits() {
		FacesContext fc = FacesContext.getCurrentInstance();
		if(fc !=null && fc.getExternalContext()!=null){
			infoSession=(InfoSession)fc.getExternalContext().getApplicationMap().get("infoSession");
		}
        listeProduits = new ArrayList<ProduitSelectionne>();
        if (infoSession == null){
        	System.out.println("Attention infoSession non recupere");
        }
        if (infoSession.getPanier() == null){
        	System.out.println("Attention infoSession.getPanier() non recupere");
        }
         listeProduits.addAll(infoSession.getPanier().getProduitSelectionnes());
        Collections.sort(listeProduits);
    }

    public String doSelection() {
        // System.out.println("selection" + idSelProduit);
        return null;
    }

    public void recalculePanier(ComponentSystemEvent event) {
    	if (infoSession.getPanier() != null){
        infoSession.getPanier().setTotalPanier(0);
        Set<ProduitSelectionne> liste2 = new HashSet<ProduitSelectionne>();
        for (ProduitSelectionne ps : listeProduits) {
            if (ps.getQuantite() != 0) {
                liste2.add(ps);
            }
            infoSession.getPanier().setTotalPanier(
                    infoSession.getPanier().getTotalPanier() + ps.getQuantite()
                            * ps.getProduit().getPrix());
        }
        double montant = Math.round(infoSession.getPanier().getTotalPanier() * 1000000000);
        montant = montant / 1000000000;
        infoSession.getPanier().setTotalPanier(montant);
        infoSession.getPanier().setProduitSelectionnes(liste2);
    	}
    }

    public String doSauve() {
        infoSession.getPanier().setTotalPanier(0);
        Set<ProduitSelectionne> liste2 = new HashSet<ProduitSelectionne>();
        for (ProduitSelectionne ps : listeProduits) {
            if (ps.getQuantite() != 0) {
                liste2.add(ps);
            }
            infoSession.getPanier().setTotalPanier(
                    infoSession.getPanier().getTotalPanier() + ps.getQuantite()
                            * ps.getProduit().getPrix());
        }
        infoSession.getPanier().setProduitSelectionnes(liste2);
        serviceFacade.getServicePanier().mettreAJour(infoSession.getPanier());
        return null;
    }

    public String doCommande() {
        doSauve();
        System.out.println("infoSession panier " + infoSession.getLogin() + " de " + infoSession.getPrenom() + " " +infoSession.getNom());
        message = "";
        System.out.println("infosession est connecté " + infoSession.isEstConnecte());
        if (infoSession.getLogin() == null  || infoSession.getLogin().equals("") || !infoSession.isEstConnecte() ) {
        	System.out.println("je dois me connecter");
        	return "Connexion";
        } else {
        	System.out.println("je suis connecté");
//            List<Client> clients = serviceFacade.getServiceClient()
//                    .rechercherParNom("login", login);
//            System.out.println(" client " + clients.get(0).getNom());
//            if (clients.size() == 0) {
//                message = "inconnu";
//                return null;
//            }
//            infoSession.setLogin(login);
            commandeMB.setInfoSession(infoSession);
            commandeMB.chargerClient();
            return "commande";
        }
    }
    
    public String doVider(){
    	this.infoSession.setPanier(null);
    	
    	String page = null;
    	if (infoSession.getLogin() == null  || infoSession.getLogin().equals("") || !infoSession.isEstConnecte() ) {
        	page = "AccueilVisiteur";
        } else {
        	page = "AccueilClient";
        }
        return page;
    }

    public List<ProduitSelectionne> getListeProduits() {
        return listeProduits;
    }

    public void setListeProduits(List<ProduitSelectionne> listeProduits) {
        this.listeProduits = listeProduits;
    }

    /**
     * @return the message
     */
    public String getMessage() {
        return message;
    }

    /**
     * @param message
     *            the message to set
     */
    public void setMessage(String message) {
        this.message = message;
    }

    /**
     * @return the infoSession
     */
    public InfoSession getInfoSession() {
        return infoSession;
    }

    /**
     * @param paramInfoSession
     *            the infoSession to set
     */
    public void setInfoSession(InfoSession paramInfoSession) {
        infoSession = paramInfoSession;
    }

    /**
     * @return the serviceFacade
     */
    public IServiceFacade getServiceFacade() {
        return serviceFacade;
    }

    /**
     * @param paramServiceFacade
     *            the serviceFacade to set
     */
    public void setServiceFacade(IServiceFacade paramServiceFacade) {
        serviceFacade = paramServiceFacade;
    }

    /**
     * @return the login
     */
    public String getLogin() {
        return login;
    }

    /**
     * @param paramLogin
     *            the login to set
     */
    public void setLogin(String paramLogin) {
        login = paramLogin;
    }

    /**
     * @return the commandeMB
     */
    public CommandeMB getCommandeMB() {
        return commandeMB;
    }

    /**
     * @param commandeMB
     *            the commandeMB to set
     */
    public void setCommandeMB(CommandeMB commandeMB) {
        this.commandeMB = commandeMB;
    }
}
